
#include "edgeID.h"
#include "main-tools.h"

//***************** FUNZIONI PUBBLICHE ***********************

PedgeID initEdgeID(short _start,short _end){
	PedgeID result=(PedgeID)malloc(sizeof(PedgeID));
	checkMalloc(result,"tabu.c:initArc:1");
	result->i=_start;
	result->j=_end;
	return result;
}

void freeEdgeID(PedgeID e){
	free(e);
}

void printEdgeID(FILE* f, PedgeID e){
	fprintf(f,"(%d,%d)", e->i+1, e->j+1);
}

bool equals(PedgeID e1, PedgeID e2){
	return (e1->i==e2->i && e1->j==e2->j) || (e1->i==e2->j && e1->j==e2->i);
}

//TODO pat ha aggiunto check e1!=e2, modificare doc
//TODO e' meglio farlo diviso perche' cosi' si evitano doppi controlli inutili! meglio una precondizione in piu' che doppi controlli :D
bool areConsecutive(PedgeID pe1, PedgeID pe2){
	if(!equals(pe1, pe2))
		return pe1->i==pe2->i || pe1->j==pe2->j || pe1->i==pe2->j || pe1->j==pe2->i;
	return false;
}
//TODO ma come precondizione c'e' il fatto che i due archi SIANO consecutivi!!! ci sono molti controlli ridondanti!
int getSharedNode(PedgeID e1, PedgeID e2){
	if(areConsecutive(e1, e2))
		return (e1->i==e2->i || e1->i==e2->j) ? e1->i : e1->j;
	else
		return NO_SHARED_NODE;
}
//TODO testing
bool isNodeUsedByEdgeID(PedgeID e, int node){
	return node==e->i || node==e->j;
}

void validateEdgeID(PedgeID e){
	if (e->i >= e->j){
		int tmp = e->i;
		e->i = e->j;
		e->j = tmp;
	}
}

//TODO testing
int getEdgeIDOtherNode(PedgeID e,int node){
	return e->i==node?e->j:e->i;
}


